//package com.dominator.socket;
//
//
//import com.dominFramework.core.typewrap.Dto;
//import com.dominFramework.core.typewrap.Dtos;
//import com.dominFramework.core.utils.JsonUtils;
//import com.dominator.enums.ReqEnums;
//import com.dominator.utils.api.ApiUtils;
//import com.dominator.utils.dao.RedisUtil;
//import com.dominator.utils.encode.Des3Utils;
//import com.dominator.utils.exception.ApiException;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.lang.reflect.Method;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.CopyOnWriteArraySet;
//
//@Component
//@ServerEndpoint(value = "/guaWebsocket/{guaMachineId}")
//@Slf4j
//public class GuaMachineWebSocket {
//    //线程安全的静态变量，表示在线连接数
//    private static volatile int onlineCount = 0;
//
//    //用来存放每个客户端对应的WebSocket对象，适用于同时与多个客户端通信
//    public static CopyOnWriteArraySet<GuaMachineWebSocket> guaWebSocketSet = new CopyOnWriteArraySet<GuaMachineWebSocket>();
//    //若要实现服务端与指定客户端通信的话，可以使用Map来存放，其中Key可以为用户标识
//    public static ConcurrentHashMap<Session, Object> guaWebSocketMap = new ConcurrentHashMap<Session, Object>();
//
//    private static RedisUtil ru = RedisUtil.getRu();
//
//
//    //与某个客户端的连接会话，通过它实现定向推送(只推送给某个用户)
//    private Session session;
//
//
//    public static synchronized int getOnlineCount() {
//        return onlineCount;
//    }
//
//    public static synchronized void addOnlineCount() {
//        GuaMachineWebSocket.onlineCount++;
//    }
//
//    public static synchronized void subOnlineCount() {
//        GuaMachineWebSocket.onlineCount--;
//    }
//
//
//    /**
//     * 连接建立成功调用的方法
//     *
//     * @param session 可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
//     */
//    @OnOpen
//    public void onOpen(@PathParam("guaMachineId") String guaMachineId, Session session) {
//        this.session = session;
//        guaWebSocketSet.add(this);     //加入set中
//        guaWebSocketMap.put(session, this); //加入map中
//        addOnlineCount();
//
//        //机器登陆的实现
//        SocketMessage msg = new SocketMessage();
//        Dto dto = Dtos.newDto();
//        try {
//            dto.put("guaMachineId'",guaMachineId);
//            dto.put("sessionId", session.getId());
//            dto.put("router","'ApiGuaMachineService");
//            dto.put("method","login");
//            Object object = BeanLoader.getSpringBean(dto.getString("router"));
//            Class c = object.getClass();
//            Method  method= c.getMethod(dto.getString("method"), Dto.class);
//            Object resultObj = method.invoke(object, dto);
//            if (resultObj instanceof SocketMessage) {
//                msg = (SocketMessage) resultObj;
//            } else {
//                return;
//            }
//        } catch (ApiException e) {
//            msg.setCode(e.getCode());
//            msg.setMessage(e.getMessage());
//            msg.setRouter(dto.getString("router"));
//            msg.setMethod(dto.getString("method"));
//        } catch (Exception e) {
//            e.printStackTrace();
//            msg = new SocketMessage(ReqEnums.SYS_ERROR, dto.getString("router"),dto.getString("'method"));
//        } finally {
//            sendToMySession(msg, session);
//        }
//
//    }
//
//    /**
//     * 连接关闭调用的方法
//     */
//    @OnClose
//    public void onClose(Session closeSession) {
//        guaWebSocketSet.remove(this); //从set中删除
//        guaWebSocketMap.remove(closeSession); //从map中删除
//        subOnlineCount();          //在线数减1
//        //--------------群发消息(多用于聊天室场景)
//        for (GuaMachineWebSocket item : guaWebSocketSet) {
//            try {
//                this.session.getBasicRemote().sendText ("有一连接关闭！当前在线人数为" + getOnlineCount());
//            } catch (IOException e) {
//                e.printStackTrace();
//                continue;
//            }
//        }
//
//    }
//
//    /**
//     * 收到客户端消息后调用的方法
//     *
//     * @param message   客户端发送过来的消息
//     * @param mySession 可选的参数
//     * @throws Exception
//     */
//    @OnMessage
//    public void onMessage(String message, Session mySession) throws Exception {
//        log.info("会话sessionId" + mySession.getId() + "来自客户端的消息:" + message);
//        SocketMessage socketMessage= WebSocketTools.invokeMethod(message,mySession);
//        sendToMySession(socketMessage,mySession);
//    }
//
//
//    /**
//     * 发生错误时调用
//     *
//     * @param session
//     * @param error
//     */
//    @OnError
//    public void onError(Session session, Throwable error) {
//        log.error("发生错误");
//        log.info("会话id" + session.getId());
//        try {
//            Object object = BeanLoader.getSpringBean("ApiGuaMachineService");
//            Class c = object.getClass();
//            Method method = c.getMethod("delAllSession", String.class);
//            method.invoke(object, session.getId());
//        } catch (Exception e) {
//            log.error("删除会话失败");
//        }
//
//    }
//
//
//
//    /**
//     * 发送信息
//     * @param mySession
//     * @param message
//     * @throws IOException
//     */
//    public void sendMessage(Session mySession, String message) throws IOException {
//        synchronized (this) {
//            WebSocketTools.sendMessage(message, mySession);
//        }
//    }
//
//    /**
//     * 发送给当前会话
//     * @param msg
//     * @param mySession
//     */
//    public void sendToMySession(SocketMessage msg, Session mySession) {
//        //推送给单个客户端
//        sendToSessionId(msg,mySession.getId());
//    }
//
//    /**
//     * 发送给指定的会话id
//     * @param msg
//     * @param sessionId
//     */
//    public static void sendToSessionId(Object msg, String sessionId) {
//        for (Session session : guaWebSocketMap.keySet()) {
//            if (session.getId().equals(sessionId)) {
//                GuaMachineWebSocket item = (GuaMachineWebSocket) guaWebSocketMap.get(session);
//                try {
//                    item.sendMessage(session, Des3Utils.encResponse(msg));
//                } catch (IOException e) {
//                    e.printStackTrace();
//                    log.error("发送失败" + e.getMessage());
//                }
//            }
//        }
//    }
//
//
//
//}
//
